<html>
<script>
myName = "global";

function foo(){
alert(myName);
var myName="local";
alert(myName);
}
/*  变量在同一作用域(同一函数)中，声明都是被提至作用域顶部先进行解析的。 */

// foo(); // “undefined” 与 “local”

/* a 变量的声明被提前到了代码顶端，此时还未赋值。接下来进入 if 语句，判断条件中 "a" in window 已成立(a 已被声明为全局变量)，所以判断语句计算结果为 false，直接就跳出 if 语句了，所以 a 的值为 undefined。
*/

if(!("a" in window)){
	var a = 1;
}
// alert(a);

// 函数声明也是被提前至作用域顶部，先于任何表达式和语句被解析和求值的

// alert(typeof foo1);// "function"
function foo1() {
// body...
}

// alert(typeof foo2);// "undefined"
var foo2 = function(){
// body...
};

/* 运行以上代码片段，看到的两次弹窗显示的都是 “2”，为什么不是分别为 “1” 和 “2” 呢？很简单，test 的声明先于 test() 被解析，由于后者覆盖前者，所以两次执行的结果都是 “2”。
解决：多数情况下，我用函数表达式来代替函数声明，特别是在一些语句块中。
*/

function test(){
alert("1");
}
// test();
function test(){
alert("2");
}
// test();

// function self execution
/*
var bar = function(x){
 alert(x);
}(12);

(function foo(x){
 alert(x);
}(13));

new function foo(x){
 alert(x);
}(14);
*/
true&& function foo(x){
 alert(x);
}(15);

</script>
</html>